import 'lib/Animal.dart';

/**
 * 面向对象编程（OOP）三个基本特征：封装、继承、多态
 *
 *      封装：封装是对象和类概念的主要特性。
 *           封装，把客观事物封装成抽象的类，并且把自己的部分属性和方法提供给其他对象调用, 而一部分属性和方法则隐藏。
 *      继承：面向对象编程 (OOP) 语言的一个主要功能就是“继承”。
 *           继承是指这样一种能力：它可以使用现有类的功能，并在无需重新编写原来的类的情况下对这些功能进行扩展。
 *      多态：允许将子类类型的指针赋值给父类类型的指针, 同一个函数调用会有不同的执行效果 。
 *
 * Dart所有的东西都是对象，所有的对象都继承自Object类。
 *
 * 类的使用及其构造函数和Java相同
 *
 * Dart中没有public private protected等访问修饰符，可以使用_，把一个属性或方法定义成私有。
 */

class Person {
  String name;
  int age;

  // 构造函数的简写
  Person(this.name, this.age);

  // 命名构造函数
  Person.now() {
    print("一个命名构造函数");
  }
}

class Rect {
  num height;
  num width;

  // 可以在实例化之前在构造函数运行之前初始化实力变量
  Rect()
      : height = 2,
        width = 3 {}

//  Rect(this.height, this.width);

  get area {
    return this.height * this.width;
  }

  set areaHeight(value) {
    this.height = value;
  }
}

main(List<String> args) {
  Person p1 = new Person.now();

  Animal animal = new Animal("小狗", 5);

  print(animal.age);

  Rect rect = new Rect();
  print("面积：${rect.area}");
  rect.areaHeight = 6;
  print("面积：${rect.area}");
}
